Laad packages

We gebruiken de functies uit tidyverse om makkelijk data te transformeren (dplyr) en te visualiseren (ggplot). Met plotly kunnen de grafieken eenvoudig interactief gemaakt.

Lees data in en beoordeel kwaliteit

De data komt uit de database van een HRM-systeem en bevat functiegegevens en verzuimdata. Het betreft hier een bancaire organisatie.

myDF <- read.csv2("hra-data.csv")
head(myDF)
summary(myDF)
      Peildatum     Stam.nummer               Stromen          Naam      Man.Vrouw   
 31-01-2014:1744   Min.   :   1.0                 :4081   a      : 698   Man  :4023  
 31-01-2015:1934   1st Qu.: 319.5   -             :   4   o      : 400   Vrouw:4360  
 31-01-2016:2444   Median : 591.0   Doorstroom IN :2123   e      : 396               
 31-01-2017:2261   Mean   : 590.2   Doorstroom UIT:1705   h      : 396               
                   3rd Qu.: 852.0   Instroom      : 305   n      : 381               
                   Max.   :2465.0   Uitstroom     : 165   k      : 377               
                                                          (Other):5735               
    Geboortedatum     Leeftijd      Dienst.jaren     Organisatie  
 04-04-1986:  19   Min.   :20.20   Min.   : 0.100   Banking:8383  
 10-07-1954:  19   1st Qu.:37.85   1st Qu.: 2.700                 
 02-09-1963:  18   Median :47.50   Median : 6.200                 
 03-05-1965:  18   Mean   :46.27   Mean   : 8.964                 
 30-03-1976:  18   3rd Qu.:54.50   3rd Qu.:12.500                 
 15-04-1953:  17   Max.   :71.20   Max.   :35.900                 
 (Other)   :8274                                                  
          Organisatie.niveau.1                Organisatie.niveau.2
 Banking and Payment:6272      Business Support Services:1574     
 Corporate Services :2111      Private Banking          :1307     
                               Domestic Markets         :1278     
                               Investments              :1213     
                               Securities               : 692     
                               Auditing                 : 595     
                               (Other)                  :1724     
                Organisatie.niveau.3                   Functie     Garantieschaal 
 Business Support Services:1573      Business Banker       :3197   Min.   : 2.00  
 Domestic Markets         :1048      Consumer Banker       :1700   1st Qu.: 9.00  
 Large Accounts           : 848      Administration officer: 556   Median :11.00  
 National Investments     : 657      Investment officer    : 351   Mean   :10.42  
 Agriculture Credit       : 560      Investment assistant  : 240   3rd Qu.:12.00  
 Bank and Trusts          : 464      Business Broker       : 194   Max.   :18.00  
 (Other)                  :3233      (Other)               :2145                  
 Functieschaal        FTE           Type.Contract  Type.Arbeidsovereenkomst
 Min.   : 1.00   Min.   :0.0250   Tijdelijk:1358   D2:7027                 
 1st Qu.: 9.00   1st Qu.:0.6000   Vast     :7025   D3: 206                 
 Median :11.00   Median :0.8000                    D4:1150                 
 Mean   :10.24   Mean   :0.7624                                            
 3rd Qu.:12.00   3rd Qu.:1.0000                                            
 Max.   :17.00   Max.   :1.0000                                            
                                                                           
  Hoogstgenoten.opleiding Aantal.ziekmeldingen Dagen.afwezig  Leidinggevende
              :1674       -      :3895         -      :3575   -      :2631  
 Associate    : 981       1      :2195         3,00   : 218   780    : 286  
 Bachelor     :2660       2      :1284         1,00   : 203   781    : 247  
 Master       :2875       3      : 592         2,00   : 198   184    : 246  
 Ph.D/Doctoral: 193       4      : 267         4,00   : 180   608    : 240  
                          5      :  93         6,00   : 158   655    : 216  
                          (Other):  57         (Other):3851   (Other):4517  
 Naam.leidingegevende Einddatum.Bepaalde.Tijd
 -      :2639         31-12-2099:6949        
 m      : 995         14-03-2015: 184        
 l      : 570         13-03-2016: 134        
 j      : 460         14-04-2015: 103        
 r      : 430         13-03-2017:  92        
 o      : 376         13-04-2016:  68        
 (Other):2913         (Other)   : 853        

Verander data types, filter en voeg kolommen toe

Een aantal variabelen moet worden omgezet naar het juiste datatype. De variabelen met tijdsinformatie moeten worden omgezet naar het type Date en sommige variabelen die eigenlijk numeriek zijn worden als tekst beschouwd.

Er zijn vier peildata. Voor dit onderzoek beperken we ons tot de record van het laatste jaar. Onder de laatst peildatum staan personen die voor de startdatum van het jaar uit dienst zijn getreden. Bovendien zitten er dubbelingen in set. Na toepassing van een filter blijven de juiste records over.

We voegen nog twee kolommen toe: een kolom aantal contractuele werkdagen en het effectief aantal ziektedagen. Hiervoor gebruiken we de formules van het CBS.

myDF$Peildatum <- as.Date(myDF$Peildatum, format="%d-%m-%Y")
myDF$Geboortedatum <- as.Date(myDF$Geboortedatum, format="%d-%m-%Y")
myDF$Einddatum.Bepaalde.Tijd <- as.Date(myDF$Einddatum.Bepaalde.Tijd, format="%d-%m-%Y")
myDF$Stromen <- gsub(" ", "", myDF$Stromen)
myDF$Aantal.ziekmeldingen <- gsub("-", "", myDF$Aantal.ziekmeldingen)
myDF$Aantal.ziekmeldingen <- as.numeric(gsub(",", ".", myDF$Aantal.ziekmeldingen))
myDF$Dagen.afwezig <- gsub("-", "", myDF$Dagen.afwezig)
myDF$Dagen.afwezig <- as.numeric(gsub(",", ".", myDF$Dagen.afwezig))
# # Sommige personen hebben de organisatie eerder verlaten
start.date <- as.Date("2016-01-31")
myDF <- myDF %>% filter(Peildatum == "2017-01-31", Einddatum.Bepaalde.Tijd > start.date, Stromen == "")
myDF <- mutate(myDF, FTE.x.werkdagen=FTE*365, FTE.x.ziektedagen=FTE*Dagen.afwezig)
summary(myDF)
   Peildatum           Stam.nummer       Stromen               Naam     Man.Vrouw  
 Min.   :2017-01-31   Min.   :   1.0   Length:1064        a      : 93   Man  :498  
 1st Qu.:2017-01-31   1st Qu.: 342.8   Class :character   h      : 52   Vrouw:566  
 Median :2017-01-31   Median : 628.5   Mode  :character   o      : 52              
 Mean   :2017-01-31   Mean   : 627.1                      e      : 50              
 3rd Qu.:2017-01-31   3rd Qu.: 927.2                      d      : 49              
 Max.   :2017-01-31   Max.   :1230.0                      q      : 49              
                                                          (Other):719              
 Geboortedatum           Leeftijd      Dienst.jaren     Organisatie  
 Min.   :1945-11-01   Min.   :24.20   Min.   : 1.100   Banking:1064  
 1st Qu.:1960-10-26   1st Qu.:40.80   1st Qu.: 2.800                 
 Median :1966-12-06   Median :50.15   Median : 6.400                 
 Mean   :1968-07-20   Mean   :48.53   Mean   : 9.247                 
 3rd Qu.:1976-03-30   3rd Qu.:56.30   3rd Qu.:12.700                 
 Max.   :1992-12-06   Max.   :71.20   Max.   :35.900                 
                                                                     
          Organisatie.niveau.1                Organisatie.niveau.2
 Banking and Payment:811       Business Support Services:287      
 Corporate Services :253       Investments              :164      
                               Private Banking          :151      
                               Domestic Markets         :113      
                               Securities               : 82      
                               Auditing                 : 67      
                               (Other)                  :200      
                Organisatie.niveau.3                   Functie    Garantieschaal 
 Business Support Services:287       Business Banker       :362   Min.   : 2.00  
 Large Accounts           :100       Consumer Banker       :239   1st Qu.: 9.00  
 International Investments: 91       Administration officer: 84   Median :11.00  
 Domestic Markets         : 89       Investment officer    : 42   Mean   :10.45  
 Corporate Investments    : 64       Business Broker       : 36   3rd Qu.:12.00  
 Bank and Trusts          : 63       Investment assistant  : 35   Max.   :18.00  
 (Other)                  :370       (Other)               :266                  
 Functieschaal        FTE           Type.Contract Type.Arbeidsovereenkomst
 Min.   : 1.00   Min.   :0.0250   Tijdelijk:160   D2:904                  
 1st Qu.: 9.00   1st Qu.:0.6000   Vast     :904   D3: 23                  
 Median :11.00   Median :0.8000                   D4:137                  
 Mean   :10.25   Mean   :0.7629                                           
 3rd Qu.:12.00   3rd Qu.:1.0000                                           
 Max.   :17.00   Max.   :1.0000                                           
                                                                          
  Hoogstgenoten.opleiding Aantal.ziekmeldingen Dagen.afwezig    Leidinggevende
              :222        Min.   :1.000        Min.   :  0.00   -      :325   
 Associate    :126        1st Qu.:1.000        1st Qu.:  2.40   1175   : 37   
 Bachelor     :328        Median :1.000        Median :  5.60   184    : 33   
 Master       :362        Mean   :1.842        Mean   : 20.98   1179   : 30   
 Ph.D/Doctoral: 26        3rd Qu.:2.000        3rd Qu.: 14.00   1178   : 28   
                          Max.   :7.000        Max.   :380.52   780    : 27   
                          NA's   :501          NA's   :461      (Other):584   
 Naam.leidingegevende Einddatum.Bepaalde.Tijd FTE.x.werkdagen   FTE.x.ziektedagen
 -      :326          Min.   :2016-12-12      Min.   :  9.125   Min.   :  0.00   
 m      :131          1st Qu.:2099-12-31      1st Qu.:219.000   1st Qu.:  1.92   
 l      : 76          Median :2099-12-31      Median :292.000   Median :  4.48   
 a      : 65          Mean   :2086-11-23      Mean   :278.476   Mean   : 17.09   
 r      : 54          3rd Qu.:2099-12-31      3rd Qu.:365.000   3rd Qu.: 12.00   
 j      : 52          Max.   :2099-12-31      Max.   :365.000   Max.   :380.52   
 (Other):360                                                    NA's   :461      

Bereken ziekteverzuim

Door de som van de laatste twee kolommen op elkaar te delen, krijgen we het verzuimpercentage.

tot.aant.ziektedagen <- sum(myDF$FTE.x.ziektedagen, na.rm = TRUE)
tot.aant.werkdagen <- sum(myDF$FTE.x.werkdagen)
ziekteverzuim = tot.aant.ziektedagen / tot.aant.werkdagen
tot.aant.ziektedagen
[1] 10307.52
tot.aant.werkdagen
[1] 296298.6
ziekteverzuim
[1] 0.0347876

Visualiseer data

Nu de data opgeschoond is, kunnen we kijken of er opvallende patronen te ontdekken zijn.

Vergelijking leeftijdsopbouw per geslacht

Tot aan de leeftijdsgrens van 50 zijn er meer vrouwen dan mannen. Binnen de organisatie werken al meer vrouwen dan mannen. Als het doorstroompatroon voor beide geslachten gelijk blijft zal het aantal vrouwen in de organisatie nog meer toenemen.

p1 <- ggplot(myDF) +
  geom_freqpoly(aes(x=Leeftijd, color = Man.Vrouw), binwidth = 2)
ggplotly(p1, width = 800)
p2 <- ggplot(myDF) +
  geom_boxplot(aes(x=Man.Vrouw, y=Leeftijd, fill=Man.Vrouw))
ggplotly(p2, width = 800)

Vergelijking ziektedagen versus leeftijdsopbouw en geslacht

Oudere wernemers neigen zich langer ziek te melden. Of er een statistisch relevante relatie is, moet nog blijken.

p3 <- ggplot(myDF, aes(x=Leeftijd, y=Dagen.afwezig)) +
  geom_point() +
  geom_smooth(method='lm')
ggplotly(p3, width = 800)
Removed 461 rows containing non-finite values (stat_smooth).

Vergelijking ziektedagen versus organisatieniveau en type contract

Bij ‘Banking and Payment’ lijken werknemers het langste ziek te zijn. Ook deze relatie moet nog nader onderzocht worden, voordat dit definitief gesteld kan worden.

p4 <- ggplot(myDF) +
  geom_point(aes(x=Organisatie.niveau.1 , y=Dagen.afwezig, fill=Type.Contract))
ggplotly(p4, width = 800)

Vergelijking FTE versus geslacht

Er is een duidelijk aanwijzing dat vrouwen meer part-time werken dan mannen. Echter dit moet nog getoetst worden.

p4 <- ggplot(myDF) +
  geom_boxplot(aes(x=Man.Vrouw , y=FTE, fill=Man.Vrouw))
ggplotly(p4, width = 800)

Multivariate analysis

grpMV <- group_by(myDF, Man.Vrouw)
summarize(grpMV, Aantal = n(), Gem.Leeftijd = mean(Leeftijd))
summarize(grpMV, Aantal = n(), Gem.dgn.afw = mean(Dagen.afwezig, na.rm = TRUE))
grpTC <- group_by(myDF, Type.Contract)
summarize(grpTC, Aantal = n(), Gem.Leeftijd = mean(Leeftijd))
summarize(grpTC, Aantal = n(), Gem.dgn.afw = mean(Dagen.afwezig, na.rm = TRUE))

Eerder konden een aantal patronen visueel worden waargenomen. Hieronder worden ze getoetst m.b.v. ANOVA. Uiteindelijk blijkt er een statistische relatie te zijn tussen FTE en geslacht. De bijbehorende boxplot deed dit al vermoeden. Ook is er een statistisch significante positieve relatie tussen leeftijd en ziekteverzuim: met iedere tien jaar neemt het gemiddeld aantal ziektedagen met vijf toe.

m1<- aov(Dagen.afwezig ~ Type.Contract, data = myDF)
summary(m1)
               Df  Sum Sq Mean Sq F value Pr(>F)
Type.Contract   1     705   704.7   0.352  0.553
Residuals     601 1202574  2001.0               
461 observations deleted due to missingness
m2<- aov(Dagen.afwezig ~ Organisatie.niveau.1, data = myDF)
summary(m2)
                      Df  Sum Sq Mean Sq F value Pr(>F)
Organisatie.niveau.1   1     261   261.2    0.13  0.718
Residuals            601 1203018  2001.7               
461 observations deleted due to missingness
m3<- aov(FTE ~ Man.Vrouw, data = myDF)
summary(m3)
              Df Sum Sq Mean Sq F value Pr(>F)    
Man.Vrouw      1   5.61   5.608   105.5 <2e-16 ***
Residuals   1062  56.43   0.053                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
plot(TukeyHSD(m3, conf.level = 0.99),las=1, col = "red")

m4 <- glm(Dagen.afwezig ~ Leeftijd, data = myDF)
summary(m4)

Call:
glm(formula = Dagen.afwezig ~ Leeftijd, data = myDF)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-28.56  -18.83  -13.42   -4.52  354.02  

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)   -4.327      8.810  -0.491  0.62353   
Leeftijd       0.537      0.183   2.935  0.00347 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 1973.845)

    Null deviance: 1203279  on 602  degrees of freedom
Residual deviance: 1186281  on 601  degrees of freedom
  (461 observations deleted due to missingness)
AIC: 6290.6

Number of Fisher Scoring iterations: 2
LS0tCnRpdGxlOiAiSFIgQW5hbHl0aWNzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyMgTGFhZCBwYWNrYWdlcwpXZSBnZWJydWlrZW4gZGUgZnVuY3RpZXMgdWl0IGB0aWR5dmVyc2VgIG9tIG1ha2tlbGlqayBkYXRhIHRlIHRyYW5zZm9ybWVyZW4gKGBkcGx5cmApIGVuIHRlIHZpc3VhbGlzZXJlbiAoYGdncGxvdGApLiBNZXQgYHBsb3RseWAga3VubmVuIGRlIGdyYWZpZWtlbiBlZW52b3VkaWcgaW50ZXJhY3RpZWYgZ2VtYWFrdC4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShwbG90bHkpCmBgYAoKIyMjIExlZXMgZGF0YSBpbiBlbiBiZW9vcmRlZWwga3dhbGl0ZWl0CkRlIGRhdGEga29tdCB1aXQgZGUgZGF0YWJhc2UgdmFuIGVlbiBIUk0tc3lzdGVlbSBlbiBiZXZhdCBmdW5jdGllZ2VnZXZlbnMgZW4gdmVyenVpbWRhdGEuIEhldCBiZXRyZWZ0IGhpZXIgZWVuIGJhbmNhaXJlIG9yZ2FuaXNhdGllLgoKYGBge3J9Cm15REYgPC0gcmVhZC5jc3YyKCJocmEtZGF0YS5jc3YiKQpoZWFkKG15REYpCnN1bW1hcnkobXlERikKYGBgCgoKIyMgVmVyYW5kZXIgZGF0YSB0eXBlcywgZmlsdGVyIGVuIHZvZWcga29sb21tZW4gdG9lCgpFZW4gYWFudGFsIHZhcmlhYmVsZW4gbW9ldCB3b3JkZW4gb21nZXpldCBuYWFyIGhldCBqdWlzdGUgZGF0YXR5cGUuIERlIHZhcmlhYmVsZW4gbWV0IHRpamRzaW5mb3JtYXRpZSBtb2V0ZW4gd29yZGVuIG9tZ2V6ZXQgbmFhciBoZXQgdHlwZSBgRGF0ZWAgZW4gc29tbWlnZSB2YXJpYWJlbGVuIGRpZSBlaWdlbmxpamsgbnVtZXJpZWsgemlqbiB3b3JkZW4gYWxzIHRla3N0IGJlc2Nob3V3ZC4KCkVyIHppam4gdmllciBwZWlsZGF0YS4gVm9vciBkaXQgb25kZXJ6b2VrIGJlcGVya2VuIHdlIG9ucyB0b3QgZGUgcmVjb3JkIHZhbiBoZXQgbGFhdHN0ZSBqYWFyLiBPbmRlciBkZSBsYWF0c3QgcGVpbGRhdHVtIHN0YWFuIHBlcnNvbmVuIGRpZSB2b29yIGRlIHN0YXJ0ZGF0dW0gdmFuIGhldCBqYWFyIHVpdCBkaWVuc3QgemlqbiBnZXRyZWRlbi4gQm92ZW5kaWVuIHppdHRlbiBlciBkdWJiZWxpbmdlbiBpbiBzZXQuIE5hIHRvZXBhc3NpbmcgdmFuIGVlbiBmaWx0ZXIgYmxpanZlbiBkZSBqdWlzdGUgcmVjb3JkcyBvdmVyLiAKCldlIHZvZWdlbiBub2cgdHdlZSBrb2xvbW1lbiB0b2U6IGVlbiBrb2xvbSBhYW50YWwgY29udHJhY3R1ZWxlIHdlcmtkYWdlbiBlbiBoZXQgZWZmZWN0aWVmIGFhbnRhbCB6aWVrdGVkYWdlbi4gSGllcnZvb3IgZ2VicnVpa2VuIHdlIGRlIGZvcm11bGVzIHZhbiBoZXQgW0NCU10oaHR0cHM6Ly93d3cuY2JzLm5sL25sLW5sL2RlZWxuZW1lcnMtZW5xdWV0ZXMvZGVlbG5lbWVycy1lbnF1ZXRlcy9iZWRyaWp2ZW4vZmFxL3ZhY3R1cmVzJTIwZW4lMjB6aWVrdGV2ZXJ6dWltL2hvZS1iZXBhYWwtaWstaGV0LXppZWt0ZXZlcnp1aW1wZXJjZW50YWdlLSkuCgpgYGB7cn0KbXlERiRQZWlsZGF0dW0gPC0gYXMuRGF0ZShteURGJFBlaWxkYXR1bSwgZm9ybWF0PSIlZC0lbS0lWSIpCm15REYkR2Vib29ydGVkYXR1bSA8LSBhcy5EYXRlKG15REYkR2Vib29ydGVkYXR1bSwgZm9ybWF0PSIlZC0lbS0lWSIpCm15REYkRWluZGRhdHVtLkJlcGFhbGRlLlRpamQgPC0gYXMuRGF0ZShteURGJEVpbmRkYXR1bS5CZXBhYWxkZS5UaWpkLCBmb3JtYXQ9IiVkLSVtLSVZIikKCm15REYkU3Ryb21lbiA8LSBnc3ViKCIgIiwgIiIsIG15REYkU3Ryb21lbikKbXlERiRBYW50YWwuemlla21lbGRpbmdlbiA8LSBnc3ViKCItIiwgIiIsIG15REYkQWFudGFsLnppZWttZWxkaW5nZW4pCm15REYkQWFudGFsLnppZWttZWxkaW5nZW4gPC0gYXMubnVtZXJpYyhnc3ViKCIsIiwgIi4iLCBteURGJEFhbnRhbC56aWVrbWVsZGluZ2VuKSkKbXlERiREYWdlbi5hZndlemlnIDwtIGdzdWIoIi0iLCAiIiwgbXlERiREYWdlbi5hZndlemlnKQpteURGJERhZ2VuLmFmd2V6aWcgPC0gYXMubnVtZXJpYyhnc3ViKCIsIiwgIi4iLCBteURGJERhZ2VuLmFmd2V6aWcpKQoKCiMgIyBTb21taWdlIHBlcnNvbmVuIGhlYmJlbiBkZSBvcmdhbmlzYXRpZSBlZXJkZXIgdmVybGF0ZW4Kc3RhcnQuZGF0ZSA8LSBhcy5EYXRlKCIyMDE2LTAxLTMxIikKbXlERiA8LSBteURGICU+JSBmaWx0ZXIoUGVpbGRhdHVtID09ICIyMDE3LTAxLTMxIiwgRWluZGRhdHVtLkJlcGFhbGRlLlRpamQgPiBzdGFydC5kYXRlLCBTdHJvbWVuID09ICIiKQoKbXlERiA8LSBtdXRhdGUobXlERiwgRlRFLngud2Vya2RhZ2VuPUZURSozNjUsIEZURS54LnppZWt0ZWRhZ2VuPUZURSpEYWdlbi5hZndlemlnKQpzdW1tYXJ5KG15REYpCmBgYAoKIyMjIEJlcmVrZW4gemlla3RldmVyenVpbQoKRG9vciBkZSBzb20gdmFuIGRlIGxhYXRzdGUgdHdlZSBrb2xvbW1lbiBvcCBlbGthYXIgdGUgZGVsZW4sIGtyaWpnZW4gd2UgaGV0IHZlcnp1aW1wZXJjZW50YWdlLgoKYGBge3J9CnRvdC5hYW50LnppZWt0ZWRhZ2VuIDwtIHN1bShteURGJEZURS54LnppZWt0ZWRhZ2VuLCBuYS5ybSA9IFRSVUUpCnRvdC5hYW50LndlcmtkYWdlbiA8LSBzdW0obXlERiRGVEUueC53ZXJrZGFnZW4pCnppZWt0ZXZlcnp1aW0gPSB0b3QuYWFudC56aWVrdGVkYWdlbiAvIHRvdC5hYW50LndlcmtkYWdlbgoKdG90LmFhbnQuemlla3RlZGFnZW4KdG90LmFhbnQud2Vya2RhZ2VuCnppZWt0ZXZlcnp1aW0KCmBgYAoKIyMjIFZpc3VhbGlzZWVyIGRhdGEKCk51IGRlIGRhdGEgb3BnZXNjaG9vbmQgaXMsIGt1bm5lbiB3ZSBraWprZW4gb2YgZXIgb3B2YWxsZW5kZSBwYXRyb25lbiB0ZSBvbnRkZWtrZW4gemlqbi4KCiMjIyMgVmVyZ2VsaWpraW5nIGxlZWZ0aWpkc29wYm91dyBwZXIgZ2VzbGFjaHQKVG90IGFhbiBkZSBsZWVmdGlqZHNncmVucyB2YW4gNTAgemlqbiBlciBtZWVyIHZyb3V3ZW4gZGFuIG1hbm5lbi4gQmlubmVuIGRlIG9yZ2FuaXNhdGllIHdlcmtlbiBhbCBtZWVyIHZyb3V3ZW4gZGFuIG1hbm5lbi4gQWxzIGhldCBkb29yc3Ryb29tcGF0cm9vbiB2b29yIGJlaWRlIGdlc2xhY2h0ZW4gZ2VsaWprIGJsaWpmdCB6YWwgaGV0IGFhbnRhbCB2cm91d2VuIGluIGRlIG9yZ2FuaXNhdGllIG5vZyBtZWVyIHRvZW5lbWVuLgoKYGBge3J9CgpwMSA8LSBnZ3Bsb3QobXlERikgKwogIGdlb21fZnJlcXBvbHkoYWVzKHg9TGVlZnRpamQsIGNvbG9yID0gTWFuLlZyb3V3KSwgYmlud2lkdGggPSAyKQpnZ3Bsb3RseShwMSwgd2lkdGggPSA4MDApCmBgYAoKYGBge3J9CnAyIDwtIGdncGxvdChteURGKSArCiAgZ2VvbV9ib3hwbG90KGFlcyh4PU1hbi5Wcm91dywgeT1MZWVmdGlqZCwgZmlsbD1NYW4uVnJvdXcpKQpnZ3Bsb3RseShwMiwgd2lkdGggPSA4MDApCgpgYGAKCiMjIyMgVmVyZ2VsaWpraW5nIHppZWt0ZWRhZ2VuIHZlcnN1cyBsZWVmdGlqZHNvcGJvdXcgZW4gZ2VzbGFjaHQKT3VkZXJlIHdlcm5lbWVycyBuZWlnZW4gemljaCBsYW5nZXIgemllayB0ZSBtZWxkZW4uIE9mIGVyIGVlbiBzdGF0aXN0aXNjaCByZWxldmFudGUgcmVsYXRpZSBpcywgbW9ldCBub2cgYmxpamtlbi4KCmBgYHtyfQpwMyA8LSBnZ3Bsb3QobXlERiwgYWVzKHg9TGVlZnRpamQsIHk9RGFnZW4uYWZ3ZXppZykpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0nbG0nKQpnZ3Bsb3RseShwMywgd2lkdGggPSA4MDApCmBgYAoKIyMjIyBWZXJnZWxpamtpbmcgemlla3RlZGFnZW4gdmVyc3VzIG9yZ2FuaXNhdGllbml2ZWF1IGVuIHR5cGUgY29udHJhY3QKCkJpaiAnQmFua2luZyBhbmQgUGF5bWVudCcgbGlqa2VuIHdlcmtuZW1lcnMgaGV0IGxhbmdzdGUgemllayB0ZSB6aWpuLiBPb2sgZGV6ZSByZWxhdGllIG1vZXQgbm9nIG5hZGVyIG9uZGVyem9jaHQgd29yZGVuLCB2b29yZGF0IGRpdCBkZWZpbml0aWVmIGdlc3RlbGQga2FuIHdvcmRlbi4KCmBgYHtyfQpwNCA8LSBnZ3Bsb3QobXlERikgKwogIGdlb21fcG9pbnQoYWVzKHg9T3JnYW5pc2F0aWUubml2ZWF1LjEgLCB5PURhZ2VuLmFmd2V6aWcsIGZpbGw9VHlwZS5Db250cmFjdCkpCmdncGxvdGx5KHA0LCB3aWR0aCA9IDgwMCkKYGBgCgojIyMjIFZlcmdlbGlqa2luZyBGVEUgdmVyc3VzIGdlc2xhY2h0CgpFciBpcyBlZW4gZHVpZGVsaWprIGFhbndpanppbmcgZGF0IHZyb3V3ZW4gbWVlciBwYXJ0LXRpbWUgd2Vya2VuIGRhbiBtYW5uZW4uIEVjaHRlciBkaXQgbW9ldCBub2cgZ2V0b2V0c3Qgd29yZGVuLgoKYGBge3J9CnA0IDwtIGdncGxvdChteURGKSArCiAgZ2VvbV9ib3hwbG90KGFlcyh4PU1hbi5Wcm91dyAsIHk9RlRFLCBmaWxsPU1hbi5Wcm91dykpCmdncGxvdGx5KHA0LCB3aWR0aCA9IDgwMCkKYGBgCgojIyMgTXVsdGl2YXJpYXRlIGFuYWx5c2lzCgoKYGBge3J9CmdycE1WIDwtIGdyb3VwX2J5KG15REYsIE1hbi5Wcm91dykKc3VtbWFyaXplKGdycE1WLCBBYW50YWwgPSBuKCksIEdlbS5MZWVmdGlqZCA9IG1lYW4oTGVlZnRpamQpKQpzdW1tYXJpemUoZ3JwTVYsIEFhbnRhbCA9IG4oKSwgR2VtLmRnbi5hZncgPSBtZWFuKERhZ2VuLmFmd2V6aWcsIG5hLnJtID0gVFJVRSkpCmBgYAoKYGBge3J9CmdycFRDIDwtIGdyb3VwX2J5KG15REYsIFR5cGUuQ29udHJhY3QpCnN1bW1hcml6ZShncnBUQywgQWFudGFsID0gbigpLCBHZW0uTGVlZnRpamQgPSBtZWFuKExlZWZ0aWpkKSkKc3VtbWFyaXplKGdycFRDLCBBYW50YWwgPSBuKCksIEdlbS5kZ24uYWZ3ID0gbWVhbihEYWdlbi5hZndlemlnLCBuYS5ybSA9IFRSVUUpKQpgYGAKCkVlcmRlciBrb25kZW4gZWVuIGFhbnRhbCBwYXRyb25lbiB2aXN1ZWVsIHdvcmRlbiB3YWFyZ2Vub21lbi4gSGllcm9uZGVyIHdvcmRlbiB6ZSBnZXRvZXRzdCBtLmIudi4gQU5PVkEuIFVpdGVpbmRlbGlqayBibGlqa3QgZXIgZWVuIHN0YXRpc3Rpc2NoZSByZWxhdGllIHRlIHppam4gdHVzc2VuIEZURSBlbiBnZXNsYWNodC4gRGUgYmlqYmVob3JlbmRlIGJveHBsb3QgZGVlZCBkaXQgYWwgdmVybW9lZGVuLiBPb2sgaXMgZXIgZWVuIHN0YXRpc3Rpc2NoIHNpZ25pZmljYW50ZSBwb3NpdGlldmUgcmVsYXRpZSB0dXNzZW4gbGVlZnRpamQgZW4gemlla3RldmVyenVpbTogbWV0IGllZGVyZSB0aWVuIGphYXIgbmVlbXQgaGV0IGdlbWlkZGVsZCBhYW50YWwgemlla3RlZGFnZW4gbWV0IHZpamYgdG9lLgoKYGBge3J9Cm0xPC0gYW92KERhZ2VuLmFmd2V6aWcgfiBUeXBlLkNvbnRyYWN0LCBkYXRhID0gbXlERikKc3VtbWFyeShtMSkKCm0yPC0gYW92KERhZ2VuLmFmd2V6aWcgfiBPcmdhbmlzYXRpZS5uaXZlYXUuMSwgZGF0YSA9IG15REYpCnN1bW1hcnkobTIpCgptMzwtIGFvdihGVEUgfiBNYW4uVnJvdXcsIGRhdGEgPSBteURGKQpzdW1tYXJ5KG0zKQoKcGxvdChUdWtleUhTRChtMywgY29uZi5sZXZlbCA9IDAuOTkpLGxhcz0xLCBjb2wgPSAicmVkIikKCm00IDwtIGdsbShEYWdlbi5hZndlemlnIH4gTGVlZnRpamQsIGRhdGEgPSBteURGKQpzdW1tYXJ5KG00KQoKYGBgCgo=